package componentes.mips;

import componentes.basicos.Barramento;
import componentes.basicos.Memoria;
import java.util.ArrayList;

/**
 * 
 * 
 * @author Gustavo Miguel, Cleisson Alves, Evandro Francisco, Lucas.
 */

// Memória geral, tudo certin *Gustavo
public class MemoriaDados extends Memoria {
    
    /* atributos da Classe */
    private Barramento endereco;
    private Barramento dadosEscrita;
    private Barramento sinalLeMem;
    private Barramento sinalEscreveMem;
    private Barramento dadosLeitura;
    private ArrayList<String> stringsDados;
    
    // Construtor da classe
    
    public MemoriaDados(int tamanho) {
        super(tamanho);
        endereco = new Barramento();
        dadosEscrita = new Barramento();
        sinalLeMem = new Barramento();
        sinalEscreveMem = new Barramento();
        dadosLeitura = new Barramento();
        stringsDados = new ArrayList<String>();
    }
    

    /**
     * Configura o Barramento de dados que contém os dados que serão escritos na
     * memória.
     * @param dadosEscrita Barramento que contém os dados para escrita. 
     */
    public void setDadosEscrita(Barramento dadosEscrita) {
        this.dadosEscrita = dadosEscrita;
    }

    /**
     * Configura o Barramento que contém o endereço da memória.
     * @param endereco Barramento com o endereço da memória.
     */
    public void setEndereco(Barramento endereco) {
        this.endereco = endereco;
    }

    /**
     * configura o Barramento que indica se um determinado dado será escrito
     * na memória. Se o sinal é operante então um dado será escrito na memória.
     * @param sinalEscreveMem Barramento de sinal de escrita.
     */
    public void setSinalEscreveMem(Barramento sinalEscreveMem) {
        this.sinalEscreveMem = sinalEscreveMem;
    }

    /**
     * Configura o Barramento que indica se uma operação de leitura será efetuada
     * na memória. Um sinal operante desse Barramento indica que um dado será
     * lido na memória a partir de seu endereço dado como entrada.
     * @param sinalLeMem Barramento de sinal de leitura.
     */
    public void setSinalLeMem(Barramento sinalLeMem) {
        this.sinalLeMem = sinalLeMem;
    }

    /**
     * Método para retornar uma Lista dos dados representados em Strings.
     * @return Lista dos dados em Strings.
     */
    public ArrayList<String> getStringsDados() {
        montaStringDados();
        return stringsDados;
    }
    
    /**
     * Método para realizar uma operação de escrita na memória. Os dados
     * serão escritos se o sinal de operação de escrita for operante.
     */
    public void escreveNaMemoria() {
        if(getSinalEscreveMem().getBitsValor() == 1) {
            escreveNaMemoria(dadosEscrita.getPalavra(), endereco.getBitsValor());
        }
    }

    /**
     * Configura os dados lidos na memória. Os dados são lidos se o sinal de leitura
     * na memória for operante.
     */
    public void setDadosLeitura() {
        if(getSinalLeMem().getBitsValor() == 1) {
            this.dadosLeitura = new Barramento(getConteudoEndereco(getEndereco().getBitsValor()));
        }
    }
    
    /**
     * Retorna o Barramento dos dados lidos na memória.
     * @return Barramento com os dados lidos.
     */
    public Barramento getDadosLeitura() {
        return dadosLeitura;
    }
    
    /**
     * Retorna o Barramento que contém o endereço de memória.
     * @return Barramento com o endereço de memória.
     */
    public Barramento getEndereco() {
        return endereco;
    }

    /**
     * Retorna o Barramento que indica o sinal de escrita na memória.
     * @return Barramento de sinal de escrita.
     */
    public Barramento getSinalEscreveMem() {
        return sinalEscreveMem;
    }

    /**
     * Retorna o Barramento que indica o sinal de leitura na memória.
     * @return Barramento de sinal de leitura.
     */
    public Barramento getSinalLeMem() {
        return sinalLeMem;
    }
    
    /**
     * Método para montar as Strings de Dados.
     */
    public void montaStringDados() {
        stringsDados.clear();
        stringsDados.add("Memoria de Dados");
        for(int i = 0; i < getNumEnderecos(); i=i+4) {
                stringsDados.add("Pos "+i+" | Valor em Decimal = "+Integer.parseInt(getConteudoEndereco(i).getPalavra(),2));
        }
    }
     
} // Fim da classe.
